package com.center.growcenterserver.common;

import com.center.growcenterserver.service.FileUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;

import static com.center.growcenterserver.service.impl.GradeServiceImpl.UPLOAD_DIR;

/**
 * FileUploadController 类提供了文件上传的功能，支持多种类型的文件上传请求处理。
 * 该类中定义了三个不同的 POST 请求映射方法，分别用于处理不同场景下的文件上传操作：
 */

@RestController
public class FileUploadController {


    @Value("${file.upload-dir}")
    private String uploadDir;

    @Autowired
    private FileUploadService fileUploadService;



    /**
     *   1. handleFileUpload 方法（路径为 "singer/avatar/update1"）：专门用于歌手头像图片的更新。
     *      - 接受两个参数：id（歌手ID）和 file（要上传的文件）。
     *      - 根据提供的ID生成唯一的文件名，并删除之前同名的老文件。
     *      - 将新上传的文件保存到服务器，并返回一个包含新文件URL的成功消息。
     */
    @PostMapping("singer/avatar/update1")
    public ResponseEntity<String> handleFileUpload(@RequestParam("id") Long id, @RequestParam("file") MultipartFile file) {
        try {
            // 如果文件目录不存在则创建新目录
            Path uploadPath = Paths.get(uploadDir);
            if (!Files.exists(uploadPath)) {
                Files.createDirectories(uploadPath);
            }

            // 构建文件名
            String filename = "singer_" + id + "_" + file.getOriginalFilename();
            Path filePath = uploadPath.resolve(filename);

            // 删除同名的老文件
            Files.list(uploadPath)
                    .filter(path -> path.getFileName().toString().startsWith("singer_" + id + "_"))
                    .forEach(oldFile -> {
                        try {
                            Files.delete(oldFile);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    });

            // 保存新文件
            file.transferTo(filePath);

            // 更新用户的头像图片在数据库中的路径
            String newPicUrl = "/uploads/" + filename;

            return new ResponseEntity<>("File uploaded successfully: " + newPicUrl, HttpStatus.OK);
        } catch (IOException e) {
            return new ResponseEntity<>("Failed to upload file", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
    private static final String UPLOAD_DIR = "src/file"; // 修改为你的实际路径


    /**
     *   2. handleFileUpload 方法（路径为 "/gradeupload"）：用于一般文件上传，适用于成绩相关文件。
     *      - 验证上传文件是否为空，创建安全的文件名以防止路径遍历攻击。
     *      - 使用临时文件存储上传的文件，再将其移动到最终位置。
     *      - 调用服务层方法处理文件数据，最后返回上传成功或失败的消息。
     * @param file
     * @return
     */

    @PostMapping("/gradeupload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "请上传文件";
        }
        try {
            // 确保上传目录存在
            Path uploadDirPath = Paths.get(UPLOAD_DIR);
            if (!Files.exists(uploadDirPath)) {
                Files.createDirectories(uploadDirPath);
            }

            // 构建安全的目标文件名，防止路径遍历攻击
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            String safeFileName = UUID.randomUUID().toString() + extension;

            // 创建临时文件路径
            Path tempFilePath = Files.createTempFile("upload-", extension);

            // 将上传的文件复制到临时位置
            try (InputStream inputStream = file.getInputStream()) {
                Files.copy(inputStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
            }

            // 调用服务层方法处理文件，传递临时文件路径
            fileUploadService.saveFileData(tempFilePath.toString());

            // 将文件移动到最终位置
            Path finalDestination = uploadDirPath.resolve(safeFileName);
            Files.move(tempFilePath, finalDestination, StandardCopyOption.REPLACE_EXISTING);


            return "文件上传成功";

        } catch (IOException e) {
            // 记录详细错误信息
            e.printStackTrace();
            return "文件上传失败: " + e.getMessage();
        } catch (Exception e) {
            // 记录详细错误信息
            e.printStackTrace();
            throw new RuntimeException("处理文件时发生错误", e);
        }
    }



    @PostMapping("/baoyanupload")
    public String handleFileUpload2(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "请上传文件";
        }
        try {
            // 确保上传目录存在
            Path uploadDirPath = Paths.get(UPLOAD_DIR);
            if (!Files.exists(uploadDirPath)) {
                Files.createDirectories(uploadDirPath);
            }

            // 构建安全的目标文件名，防止路径遍历攻击
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            String safeFileName = UUID.randomUUID().toString() + extension;

            // 创建临时文件路径
            Path tempFilePath = Files.createTempFile("upload-", extension);

            // 将上传的文件复制到临时位置
            try (InputStream inputStream = file.getInputStream()) {
                Files.copy(inputStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
            }

            // 调用服务层方法处理文件，传递临时文件路径
            fileUploadService.saveFileData2(tempFilePath.toString());

            // 将文件移动到最终位置
            Path finalDestination = uploadDirPath.resolve(safeFileName);
            Files.move(tempFilePath, finalDestination, StandardCopyOption.REPLACE_EXISTING);


            return "文件上传成功";

        } catch (IOException e) {
            // 记录详细错误信息
            e.printStackTrace();
            return "文件上传失败: " + e.getMessage();
        } catch (Exception e) {
            // 记录详细错误信息
            e.printStackTrace();
            throw new RuntimeException("处理文件时发生错误", e);
        }
    }

}
